package com.guodi.model.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guodi.common.utils.UuidUtil;
import com.guodi.core.secure.utils.AuthUtil;
import com.guodi.model.entity.IdtMonitorFill;
import com.guodi.model.mapper.IdtMonitorFillMapper;
import com.guodi.model.service.IIdtMonitorFillService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @描述：指标填报表 服务类
 * @作者: 代鹏刚
 * @日期: 2020-10-20
 */
@Service
public class IdtMonitorFillServiceImpl extends ServiceImpl<IdtMonitorFillMapper, IdtMonitorFill> implements IIdtMonitorFillService {

    @Override
    public List<IdtMonitorFill> listByData(String indicatorsId, String[] userDivisions) {
        QueryWrapper<IdtMonitorFill> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("indicators_id", indicatorsId);
        queryWrapper.in("division_code",userDivisions);
        return this.list(queryWrapper);
    }

    @Override
    public List<IdtMonitorFill> listByData(List<String> indicatorsId, String[] userDivisions) {
        QueryWrapper<IdtMonitorFill> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("indicators_id", indicatorsId);
        queryWrapper.in("division_code",userDivisions);
        return this.list(queryWrapper);
    }



    /**
     * 重写mybatis-plus方法         <br/><br/>
     * 导入时的保存或更新。           <br/>
     * 因为存在填报一个指标多条记录的情况，每个指标填报一次算是一组记录。<br/><br/>
     * 主要是针对复合指标，因为复合指标填报时，都是一组一组填报的，每一组里面会有多个指标，为了保证回显时正常，所以需要区分这些记录分别属于哪一组。<br/><br/>
     * 如果是新增，则从最新的index开始递增。如果是修改，则直接修改         <br/><br/>
     * @param saveUpdateList 要保存或更新的数据
     * @return saveUpdateList
     */
    @Override
    public boolean saveOrUpdateBatch(Collection<IdtMonitorFill> saveUpdateList ){
        boolean isOK = true;
        for(IdtMonitorFill idtMonitorFill : saveUpdateList) {
            if (StringUtils.isBlank(idtMonitorFill.getId()) ){
                idtMonitorFill.setId(UuidUtil.get32UUID());
            }
            if (Objects.isNull(this.getById(idtMonitorFill.getId()))){
                // 新增
                isOK = isOK & this.save(idtMonitorFill);
            }else{
                // 修改
                idtMonitorFill.setCreateTime(null);
                idtMonitorFill.setCreator(null);
                idtMonitorFill.setModifyTime(Objects.isNull(idtMonitorFill.getModifyTime())? new Date(): idtMonitorFill.getModifyTime());
                idtMonitorFill.setModifier(Objects.isNull(idtMonitorFill.getModifier())? (Objects.isNull(AuthUtil.getUser())?null: AuthUtil.getUserId().toString()) : null);
                isOK = isOK & this.updateById(idtMonitorFill);
            }
        }
        return isOK;
    }

    /**
     * 重写mybatis-plus方法
     * @param batchSize  没用的
     */
    @Override
    public boolean saveBatch(Collection<IdtMonitorFill> entityList, int batchSize) {
        return this.saveBatch(entityList);
    }

    /**
     * 重写mybatis-plus方法
     */
    @Override
    public boolean saveOrUpdate(IdtMonitorFill entity) {
        return this.saveOrUpdateBatch(Arrays.asList(entity));
    }

    /**
     * 重写mybatis-plus方法
     * @param batchSize 没用的
     */
    @Override
    public boolean saveOrUpdateBatch(Collection<IdtMonitorFill> entityList, int batchSize) {
        return this.saveOrUpdateBatch(entityList);
    }

    /**
     * 重写mybatis-plus方法             <br/>
     * 注意：如果已经存在了，则不会在新增，存在判断请看 isExist 方法
     */
    @Override
    public boolean save(IdtMonitorFill idtMonitorFill) {
        idtMonitorFill.setModifyTime(null);
        idtMonitorFill.setModifier(null);
        idtMonitorFill.setCreateTime(Objects.isNull(idtMonitorFill.getModifyTime())? new Date(): idtMonitorFill.getModifyTime());
        idtMonitorFill.setCreator(Objects.isNull(idtMonitorFill.getModifier())? (Objects.isNull(AuthUtil.getUser())?null: AuthUtil.getUserId().toString()) : null);
        // 上锁，避免获取到的maxIndex不是最新
        synchronized (IdtMonitorFillServiceImpl.class) {
            // 获取最新的
            int index = this.getMaxIndex(idtMonitorFill.getIndicatorsId()) + 1;
            idtMonitorFill.setIdIndex(index);
            // 新增
            return super.save(idtMonitorFill);
        }
    }


    /**
     * 重写mybatis-plus方法
     */
    @Override
    public boolean saveBatch(Collection<IdtMonitorFill> entityList) {
        boolean isOk = true;
        for(IdtMonitorFill idtMonitorFill : entityList) {
            isOk = isOk & this.save(idtMonitorFill);
        }
        return isOk;
    }



    /**
     * 获取最新的index值
     * @param idtId 指标id
     * @return 这个指标目前最大的index值，如果没有，则默认-1
     */
    private int getMaxIndex(String idtId){
        QueryWrapper<IdtMonitorFill> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("max(index) as index");
        queryWrapper.eq("indicators_id", idtId);
        queryWrapper.groupBy("indicators_id");
        IdtMonitorFill one = this.getOne(queryWrapper);
        int index = Objects.isNull(one) || Objects.isNull(one.getIdIndex()) ? -1 : one.getIdIndex() ;
        return index;
    }

    /**
     * 根据【指标id、行政区划编码、年份、监测时间】删除
     * @param idtId 指标id
     * @param divisionCode 行政区划编码
     * @param year 年份
     * @param monitorTime 监测时间
     * @return true -- 成功，false -- 失败
     * @author 陈宏成
     * @date 2021-12-24
     */
    @Override
    public boolean delete(String idtId, String divisionCode, int year, String monitorTime){
        LambdaQueryWrapper<IdtMonitorFill> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(IdtMonitorFill::getIndicatorsId, idtId);
        queryWrapper.eq(IdtMonitorFill::getDivisionCode, divisionCode);
        queryWrapper.eq(IdtMonitorFill::getYear, year);
        queryWrapper.eq(IdtMonitorFill::getMonitorTime, monitorTime);
        return this.remove(queryWrapper);
    }
}
